# 文件名: analyze_graph.py
import json
from collections import defaultdict

def generate_graph_driven_keywords(json_filepath, top_n=20):
    """
    严格根据知识图谱的结构，客观地生成文献搜索关键词组合。
    该工具不包含任何主观解释，其输出完全由图谱的连接度决定。
    """
    # 1. 加载和验证数据
    try:
        with open(json_filepath, 'r', encoding='utf-8') as f:
            graph_data = json.load(f)
    except FileNotFoundError:
        print(f"错误: JSON文件 '{json_filepath}' 未找到。")
        return

    entities = {entity['id']: entity for entity in graph_data.get('entities', [])}
    relations = graph_data.get('relations', [])

    if not entities or not relations:
        print("错误: JSON文件内容不完整。")
        return

    # 2. 客观计算每个节点的连接度（度数）
    node_degrees = defaultdict(int)
    node_neighbors = defaultdict(list)

    for rel in relations:
        source_id = rel.get('source_id')
        target_id = rel.get('target_id')
        if source_id in entities and target_id in entities:
            node_degrees[source_id] += 1
            node_degrees[target_id] += 1
            node_neighbors[source_id].append(target_id)
            node_neighbors[target_id].append(source_id)

    # 3. 根据连接度识别出Top N个核心节点
    sorted_nodes = sorted(node_degrees.items(), key=lambda item: item[1], reverse=True)
    top_central_nodes_ids = [node_id for node_id, degree in sorted_nodes[:top_n]]

    # 4. 辅助函数：从节点名称中提取中英文部分
    def get_name_parts(node_name):
        # 简单的英文名提取，适用于 "中文名(English Name)" 格式
        if '(' in node_name and ')' in node_name:
            parts = node_name.split('(')
            chinese_name = parts[0].strip()
            english_name = parts[1].replace(')', '').strip()
            return f'("{chinese_name}" OR "{english_name}")'
        return f'"{node_name}"'

    # 5. 生成并打印基于图谱结构的关键词报告
    print("="*80)
    print("          知识图谱驱动的文献搜索关键词列表")
    print("="*80)
    print(f"\n报告生成逻辑：\n1. 自动计算知识图谱中各概念的关联度。\n2. 识别出关联度最高的 Top {top_n} 个核心概念。\n3. 为每个核心概念及其直接关联概念生成推荐的搜索关键词组合。\n")

    for node_id in top_central_nodes_ids:
        central_node = entities[node_id]
        central_name_query = get_name_parts(central_node['name'])
        
        print("-"*80)
        print(f"核心概念: {central_node['name']} (关联度: {node_degrees[node_id]})")
        print("-"*80)
        
        print("\n【宏观综述类文献】建议搜索：")
        print(f'   - {central_name_query} AND ("综述" OR "review" OR "state-of-the-art")')
        
        print("\n【具体关联研究文献】建议搜索：")
        # 使用set去重邻居节点
        unique_neighbors = set(node_neighbors[node_id])
        for neighbor_id in unique_neighbors:
            neighbor_node = entities[neighbor_id]
            neighbor_name_query = get_name_parts(neighbor_node['name'])
            print(f"   - {central_name_query} AND {neighbor_name_query}")
        print("\n")

    print("="*80)
    print("报告结束。")
    print("="*80)

# --- 主程序 ---
if __name__ == "__main__":
    json_file = 'knowledge_graph.json'
    generate_graph_driven_keywords(json_file)